package com.sprouting.ops.model;

import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sprouting.ops.annotations.invoke.CheckIsNullOrEmpty;
import com.sprouting.ops.annotations.invoke.CheckLength;
import com.sprouting.ops.annotations.invoke.CheckNotNull;
import com.sprouting.ops.enums.ComputerSpecialEnum;
import com.sprouting.ops.interfaces.AddGroup;
import com.sprouting.ops.interfaces.UpdGroup;
import lombok.Data;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;

/**
 * 服务器与计算机信息表
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2023/11/8 15:54
 */
@TableName("ops_computer_server")
@Data
public class OpsComputerServer extends BaseModel {

    /**
     * 主键
     */
    @CheckNotNull(message = "非法ID", groups = UpdGroup.class)
    @CheckIsNullOrEmpty(message = "无效ID", groups = AddGroup.class)
    @TableId
    private String id;
    /**
     * 隶属场所
     * @see OpsSite#getId()
     */
    @CheckNotNull(message = "请选择现场")
    private String siteId;
    /**
     * 机器名称，别名,这个主机的别名
     */
    @CheckLength(min = 1, max = 150, message = "机器名称超过长度限制")
    @CheckNotNull(message = "请输入机器名称")
    private String name;
    /**
     * ip地址，做多支持5个，逗号分隔
     */
    @CheckLength(max = 80, message = "IP地址长度超过最大限制，最多只支持5组IP地址")
    private String ips;
    /**
     * 访问登录信息1- 管理员级别
     * 就是访问计算机的账号密码，过程等信息，为什么这里要有多个，并且不分字段，因为有时候访问是非常复杂的，需要先访问堡垒机，在连接跳板，然后才能输入密码
     * 这里使用富文本解决这个问题，还有一台机器可能多个授权，这里最多支持记录3组访问
     */
    // @CheckLength(max = 65000, message = "访问登录信息-管理员级 长度超过最大限制")
    private String access1;
    /**
     * 访问登录信息2-普通授权（暂时不用）
     */
    @CheckLength(max = 65000, message = "访问登录信息-普通授权1 长度超过最大限制")
    private String access2;
    /**
     * 访问登录信息3-普通授权（暂时不用）
     */
    @CheckLength(max = 65000, message = "访问登录信息-普通授权2 长度超过最大限制")
    private String access3;
    /**
     * 云主机类型-华为云，阿里云;为云主机则一定为虚拟机
     * @see com.sprouting.ops.enums.CloudTypeEnum
     */
    private Integer cloudType;
    /**
     * 是否虚拟机、物理机
     * @see com.sprouting.ops.interfaces.ConstantBase.YesOrNo#YES 是虚拟机
     * @see com.sprouting.ops.interfaces.ConstantBase.YesOrNo#NO 物理机
     */
    @NotNull(message = "请选择是否虚拟机")
    private Integer vm;
    /**
     * cpu信息
     */
    private String cpu;
    /**
     * 计算机核心数，单位：核
     */
    private Integer core;
    /**
     * 计算机内存大小，单位G
     */
    private Double memory;
    /**
     * 磁盘说明，当存在多个磁盘情况说明
     */
    @CheckLength(max = 600, message = "磁盘说明超过长度限制")
    private String disk;
    /**
     * 接入网络兆数,单位兆，上行
     */
    private Double accessNetworkSizeUp;
    /**
     * 接入网络兆数,单位兆，下行
     */
    private Double accessNetworkSizeDown;
    /**
     * 父级ID，有些可以模拟机器，顶级为-1
     * @see OpsComputerServer#getId()
     * @see com.sprouting.ops.interfaces.ConstantBase.DefaultValue#STRING
     */
    @CheckNotNull(message = "缺少上级节点信息")
    private String parentId;
    /**
     * 父级ID，有些可以模拟机器，不含-1
     * @see OpsComputerServer#getId()
     */
    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    @CheckLength(max = 150, message = "上级节点超过长度限制")
    private String parentIds;
    /**
     * 计算机主机名
     */
    @CheckLength(max = 150, message = "计算机主机名超过长度限制")
    private String hostName;
    /**
     * 是否堡垒机\跳板机\网关。特殊机器
     * @see ComputerSpecialEnum
     */
    private Integer special;
    /**
     * 使用状态，使用，停用
     * @see com.sprouting.ops.interfaces.ConstantBase.Use
     */
    private Integer useStatus;
    /**
     * 计算机存放的位置-物理位置
     */
    @CheckLength(max = 500, message = "计算机存放的位置超过长度限制")
    private String storageLocation;
    /**
     * 系统类型，一般Windows、Linux
     * @see com.sprouting.ops.interfaces.ConstantBase.OsType
     */
    @NotNull(message = "请选择操作系统类型")
    private Integer os;
    /**
     * 系统版本
     */
    private String osVersion;
    /**
     * 是否关键节点
     * @see com.sprouting.ops.interfaces.ConstantBase.YesOrNo#YES 关键节点
     */
    private Integer linchpin;
    /**
     * 详情说明
     */
    @CheckLength(max = 2000, message = "详情说明超过长度限制")
    private String description;
}
